package com.xu.boot;

import ch.qos.logback.core.db.DBHelper;
import com.xu.boot.bean.Pet;
import com.xu.boot.bean.User;
import com.xu.boot.config.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * 1.主程序类：@SpringBootApplication 这个注解告诉 Springboot 这是一个 Springboot 应用
 * 2.Springboot 最佳实践：
 *      2.1 引入场景依赖
 *      2.2 查看自动配置了哪些
 *            自己分析，引入场景对应的自动配置一般都生效了
 *            配置文件中 debug=true 开启自动配置报告。Negative（不生效）\Positive（生效）
 *      2.3 是否需要修改
 *            参照文档修改配置项或者自己分析。xxxxProperties 绑定了配置文件的哪些
 *      2.4 自定义加入或者替换组件：@Bean、@Component
 *      2.5 使用自定义器：XXXXXCustomizer
 *
 */
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        // 1. 返回我们的 IOC 容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

        // 2. 查看容器里面的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }

        // 3. 从容器中获取组件
        Pet tom01 = run.getBean("tom", Pet.class);
        Pet tom02 = run.getBean("tom", Pet.class);
        System.out.println("组件: " + (tom01 == tom02));

        // 4. 如果 @Configuration 的 proxyBeanMethods 为 true 的话，
        // MyConfig 类就为 com.xu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$ad0be989@8dfe921
        // 如果为 false 的话，MyConfig 类就为 com.xu.boot.config.MyConfig@3003697
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println(bean);

        // 如果 @Configuration 的 proxyBeanMethods 为 true 的话，
        // 调用 MyConfig 中的方法相当于调用其代理对象中的方法，SpringBoot 总是会检查这个组件是否在容器中
        // 总之就是保持注册在容器中的组件单实例
        User user1 = bean.user01();
        User user2 = bean.user01();
        System.out.println(user1 == user2);

        // 5. 获取组件
        String[] beanNamesForType = run.getBeanNamesForType(User.class);
        System.out.println("----------------------------");
        for (String s : beanNamesForType) {
            System.out.println(s);
        }

        DBHelper helper = run.getBean(DBHelper.class);
        System.out.println(helper);

        // 6.获取 beans.xml 中配置的 bean
        System.out.println("haha: " + run.containsBean("haha"));
        System.out.println("hehe: " + run.containsBean("hehe"));
    }

}
